查看原文
其他

Python简单实战项目:《冰与火之歌1-5》角色关系图谱构建——数据库设计

AlanLau Python爱好者社区 2019-04-07

作者:AlanLau    Python爱好者社区专栏作者

简书专栏:https://www.jianshu.com/u/6da6a9668142

csdn博客:https://blog.csdn.net/alanconstantinelau


在弄任何一个数据之前,肯定是要先设计数据库的。这里打算将《冰与火之歌》(以下称《冰火》)的文本数据先存入到数据库中,后续在使用python读取数据来处理。


前期准备


需要工具: 


1.peewee
2.sqlite
3.python3.5(当然python2也是可以的)


大致说一下: 


1.peewee 

peewee是python中的一个轻量级ORM框架。 


什么是ORM框架?
不熟悉的同学可以看下面几个peewee的教程:
   -
peewee说明文档:http://peewee.readthedocs.io/en/latest/peewee/quickstart.html#model-definition
   -Python的ORM框架Peewee使用入门(一):https://blog.csdn.net/WuLex/article/details/52565681
怎么安装?直接pip install peewee就可以,安装有困难的话可以参考我另一篇博文python中正确安装对应版本的包:https://blog.csdn.net/alanconstantinelau/article/details/69944743


2.sqlite
sqlite是一个轻量级的数据库(轻量级这一系列东西很适合做一些小型的数据项目,以后大家可以常用)。起初是我在写C#窗体应用程序的时候发现它的。sqlite很适合用来作嵌入式数据库,和C#中的DataGridView控件简直是绝配,在稍后的博客中我也会提及到用C#配合sqlite+DataGridView开发简单的数据库检索系统,感兴趣的同学可以关注下。 


sqlite的语法基本和标准的sql语言相同,具体还有什么差异可以参考SQLite 教程
为什么说轻量级呢?它能够轻量到使用火狐浏览器的插件就可以打开。无需像sql server和mySQL一样配置用户和端口。也无需再安装一个专门的软件来写sqlite的sql。所有的所有,一个火狐浏览器+sqlite manager插件就可以完成(当然谷歌浏览器也是可以的,只是本人不常用谷歌的sqlite插件,对谷歌感兴趣的同学可以自行去查一下)。 


火狐浏览器安装sqlite manager插件:打开火狐浏览器→附加组件→右上角的搜索输入:SQLite Manager→安装→重启浏览器。


3.Python3.5
python我就没什么好说的,我用的版本是3.5,2.7的同学可以找一下对应的peewee模块。


数据来源


我需要弄的是《冰火》人物关系图,但是如何从《冰火》中体现出人物的共现呢?我这里将一个章节内出现的所有人物则作为一次共现。因为根据《冰火》小说的特点,每一章都是以一个人物视角来写的,每一章基本都在讲一个主题。如果以每一段作为共现范围的话,那么一个章节下出现的所有角色将会出现很多次共现,而这些共现是无意义的,因为他们都是在同一个主题下出现的。 


在网上找了现成的《冰火》txt版本下载,但是发现txt内的数据并不好处理。要么一个卷的所有章节堆到一个txt内,每个章节之间没有特别明显的区分特征,这样就无法用python来对文章章节进行分割;要么就是将文中的每一句作为一行,无法区分段落和章节。思来想去,最标准的格式就是现成的小说在线阅读网址。这样小说的每一段都会用<p></p>给括起来,用大数据领域的话来说,就是赤裸裸的一个结构化数据。只要是结构化的数据,什么都好处理了。所以这里就觉得顺手写一个爬虫,直接从小说在线阅读的网站把《冰火》抓取下来。我找了几个小说网站,最后看准了这家冰与火之歌小说全集:https://www.sbkk88.com/mingzhu/waiguowenxuemingzhu/bingyuhuozhige/

 
后面的网页分析以及网页抓取,将会呈现在 Scrapy+redis+mongodb分布式爬虫抓取小说《冰与火之歌1-5》


数据库的设计


根据需求,直接设计一张表足够了。表内属性最多包括id(每一条数据id,作为主键)、chapter(数据来源章节)、title(数据来源章节名)、content(章节内容)、characters(用来存储一个章节中出现的所有角色集合,注意是集合)、url(章节来源网站)、created_at(数据产生时间)。



代码实现


结合peewee,最后实现的代码为:


# -*- coding: utf-8 -*- # @Date     : 2017-04-07 10:16:53 # @Author   : Alan Lau # @Language : Python3.5 from peewee import * from datetime import datetime db = SqliteDatabase(r'A_Song_of_Ice_and_Fire.sqlite') # 建立名字为A_Song_of_Ice_and_Fire.sqlite的数据库 class BaseModel(Model):    class Meta:        database = db #新建一个novel表 class novel(BaseModel):    id = IntegerField(primary_key=True, verbose_name='id')    # 数据id,数据类型是IntegerField,对应sqlite中的Integer,作为主键。    chapter = CharField(max_length=20, null=True, verbose_name='chapter')    # 文本章节,数据类型是CharField,对应sqlite中的CHAR,长度为20,允许空值。    title = CharField(max_length=500, null=True, verbose_name='title')    # 章节标题,数据类型是CharField,对应sqlite中的CHAR,长度为500(鬼知道一个标题有多长...),允许空值。    content = TextField(null=True, verbose_name='content')    # 章节内容,数据类型是TextField,对应sqlite中的TEXT,长文本。    characters = CharField(max_length=200, null=True,                           verbose_name='characters')    # 章节中出现的演员,数据类型是CharField,对应sqlite中的CHAR,长度为200,允许空值。    url = CharField(max_length=200, null=False, verbose_name='url')    # 章节的url,方便出错后重爬    created_at = DateTimeField(        default=datetime.now(), null=True, verbose_name='Get_time')    # 产生日期 if __name__ == '__main__': #执行python    try:        novel.create_table()        #创建表语句    except Exception as err:        print(err)


运行一下 


最后在代码所在的当前路径下产生 


A_Song_of_Ice_and_Fire.sqlite文件 




然后用火狐浏览器打开,写一个检索式验证一下: 




这里检索式写得不规范,少了个;,大家不要学我….


到现在,一个数据库就设计好了,结合peewee、sqlite、python,是不是非常方便。

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门视频课程!!!

崔老师爬虫实战案例免费学习视频。

丘老师数据科学入门指导免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

丘老师Python网络爬虫实战免费学习视频。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存